
# 容器-元祖-字符串（字符串是不可修改的，如果要修改那就得到一个新的字符串）
# 单引号定义：name = '张三'  可以将双引号打印出来
# 双引号定义：name = "张三"  可以将单引号打印出来
# 三引号定义：name = """张三"""  可以允许换行
# 转移字符\

# 字符串定义
def dim_str():
    print("-" * 50, "字符串定义", "-" * 50)
    name = """张三
                李四
           """
    print(name)
    s1 = "世界你好'"
    s2 = '世界你好"'
    s3 = '世界你好\''
    s4 = "世界你好\""
    print(s1, s2, s3, s4)
# 字符串拼接
def join_str():
    print("-" * 50, "字符串拼接", "-" * 50)
    # 直接拼接
    print("直接拼接:", "hello""紫嫣")
    s1, s2 = "hello", "紫嫣"
    # 使用+号拼接
    print("使用+号拼接:", s1 + s2)
    # 使用join拼接,将s1和s2放入列表中（与字符串分割split是相反的功能）
    print("空字符使用join拼接:", "".join([s1, s2]))
    print("-使用join拼接:", "--".join([s1, s2]))
    # s2 * n s2复制n份
    print("s2 * n  s2复制n份:", s2 * 3)
    # 字符串和变量使用+号拼接会出现类型错误
    num = 1
    print("num:", num)
    try:
        s3 = s1 + num
    except TypeError as e:
        print("TypeError 字符串和变量使用+号拼接会出现类型错误:", e)
# 字符串格式化1
def format_str1():
    print("-" * 50, "字符串格式化1", "-" * 50)
    # %s 字符串占位符，将内容转化为字符串  %d 整数数字站位符，将内容转化为整数  %f浮点数站位符
    # 1、字面量和变量拼接
    wx_money = 100
    zhifubao_money = 200
    my_money = "微信余额：%s元，支付宝余额：%s元" % (wx_money, zhifubao_money)
    print(my_money)
    # 2、字符串变量和数字变量拼接
    my_money = "我的余额："
    my_money = my_money + "%s元" % (wx_money + zhifubao_money)
    print(my_money)
# 字符串格式化2
def format_str2():
    print("-" * 50, "字符串格式化2", "-" * 50)
    # 快速格式化不做数据类型和精度控制
    # 语法：f"内容{变量}"
    s = "快速格式化"
    num1 = 11.35684
    num2 = 2
    print(f"使用方法：{num1},数字为{s}")
    print(f"使用方法：{num1 + num2},数字为{s}")
# 字符串格式化3 format
def format_str3():
    print("-" * 50, "字符串格式化3", "-" * 50)
    # 不写数字，那就是按顺序进行
    print("不写下标：", "姓名:{},年龄:{},性别:{}".format("紫嫣", "女", 18))
    # 数字代表format内的下标
    print("下标：", "姓名:{0},年龄:{2},性别:{1}".format("紫嫣", "女", 18))
    # 数字复用
    print("数字复用：", "姓名:{0},年龄:{2}{1},性别:{1}".format("紫嫣", "女", 18))
    # 关键字
    print("关键字：", "姓名:{name},年龄:{age},性别:{sex}".format(sex="女", name="嫣然", age=21))
# 字符串格式化后的精度控制
def format_jindu():
    print("-" * 50, "字符串精度控制", "-" * 50)
    # m控制宽度，如果m的宽度小于数字本身，则不生效 .n控制精度，要求是数字，会进行四舍五入
    # 示例 %5d：表示整数控制在5位，如数字11，被设置为5d，变成[空格][空格][空格]11，用3个空格补足宽度
    # %5.2f:表示宽度控制为5，精度控制为2，小数和小数点也算在宽度范围内
    # 如11.38587 写成 %5,1，宽度控制在5，精度控制在1位，四舍五入，结果为[空格]11.4
    num = 11.38587
    print("%s转化为%5.1f" % (num, num))
    num = 11
    print("%s转化为%5.2f" % (num, num))
    num = 11.38587
    print("%s中m本身比数字小%2.1f，保留1为小数后有4位，所以m就无效" % (num, num))
# 字符串独有的常用方法
def str_my_fun():
    # 容器-元祖-字符串（字符串是不可修改的，如果要修改那就得到一个新的字符串）
    print("-" * 50, "字符串常用方法", "-" * 50)
    s = "I love ziYan yanRan tanMengMeng weiYiMeng ziYan ziYan"
    # 转化为大写
    print("转化为大写", s.upper())
    # 转化为小写
    print("转化为大写", s.lower())
    # 是否以什么开头
    print(f"{s}是否以什么(You)开头", s.startswith("You"))
    # 是否以什么结尾
    print(f"{s}是否以什么(.txt)结尾", s.endswith(".txt"))
    # 字符串的替换（第3个参数为替换次数，不写则默认全部替换）,替换后是一个新的字符串
    new_s = s.replace("ziYan", "南宫翎", 2)
    print("字符串替换后：", new_s)
    # s.split或 s.rsplit分割字符串（得到列表，与字符串join拼接刚好相反的功能）
    # 参数：maxsplit = 2 最大下标分割,下标为0，1正常分割，后面不管有没有空格全部作为一个整体
    s_list = s.split(" ")
    print("分割字符串：", s_list)
    s_list = s.split(" ", maxsplit=2)
    print("maxsplit最大下标分割,分割字符串：", s_list)
    # 用rsplit分割文件时，下标为1的可以直接锁定文件的类型，从右向左边分割
    s = "易语言.e.brack"
    s_list = s.rsplit(".", maxsplit=1)
    print("maxsplit最大下标分割,分割字符串：", s_list)
    # 去除前后空格  lstrip：去掉左侧空格 rstrip：去掉右侧空格
    # 如果有参数则是去掉指定左侧和右侧字符
    s = " I love ziYan yanRan tanMengMeng weiYiMeng ziYan ziYan "
    print(f"strip去除两侧空格{s.strip()}---")
    print(f"lstrip去除左侧空格{s.lstrip()}--")
    print(f"rstrip去除右侧空格{s.rstrip()}---")
    # 有大写I和空格的都会去除（注意必须连在一起）
    print(f"strip带参数去除前后指定字符{s.strip('I ')}---")
    # 去除前后的的l和k字符（中间如果有则不会去除）
    s = "lkqwertyuiop asdfghjkl lkjhgfdsa zxcvbnmkl"
    print("去除前后的的l和k字符:", s.strip("lk"))
# 字符串常用方法（公共的）
def str_pub_fun():
    print("-" * 50, "字符串常用方法（公共的）", "-" * 50)
    s = "I love ziYan yanRan tanMengMeng weiYiMeng ziYan ziYan"
    # 通过下标取出某个字符串
    print("取下标为0的元素：", s[0])
    print("取下标为-1的元素：", s[-1])
    # find 查找字符串 如果查找不到返回-1
    print(f"用find查找fqws的下标为：{s.find('fqws')}，如果没找到返回-1")
    # index 查找字符串，如果查找不到会抛异常
    print(f"用index查找ziYan的下标为：{s.index('ziYan')}，如果没找到会抛出异常")
    print(f"用index查找ziYan，从下标7开始查找，下标为：{s.index('ziYan', 7)}，如果没找到会抛出异常")
    # 字符串在指定的范围内居中,第二个参数为填充的内容
    print("-" * 20)  # 这个用作对比
    print("ziyan".center(20, "-"))
    s1 = "hello紫嫣"
    # s1 in s2：字符串s1在s2中是否存在
    print(f"字符串s1在s中是否存在:{s1 in s}")
    print(f"字符串s1在s中是否不存在：{s1 not in s}")
    # 统计字符串次数
    print("统计字符串次数：", s.count("zi"))
    # 统计字符串长度
    print("字符串长度：", len(s))
# 数据验证
def str_yanzheng():
    # 字符串-数据验证
    print("-" * 50, "数据验证", "-" * 50)
    # 验证所有的字符是否都是阿拉伯数字
    sList = ["123", "hello123", "一二三", "壹贰叁", "0b1010", "ⅠⅡⅢⅣⅤ"]
    for item in sList:
        print(f"str.isdigit() 验证阿拉伯数字  {item}：", item.isdigit())
    print()
    for item in sList:
        print(f"str.isdecimal() 验证阿拉伯数字  {item}：", item.isdecimal())
    print()
    # 验证所有的字符是否都是数字
    for item in sList:
        print(f"str.isnumeric() 验证数字  {item}：", item.isnumeric())
    print()
    # 验证所有的字符是否都是字母（包含中文字符）
    sList = ["紫嫣", "紫嫣hello", "hello123", "hello一二三", "ⅠⅡⅢⅣⅤ", "壹贰叁"]
    for item in sList:
        print(f"str.isalpha() 验证字母  {item}：", item.isalpha())
    print()
    # 验证所有的字符是否都是数字或字母（包含中文字符）
    for item in sList:
        print(f"str.isalnum() 验证数字或字母  {item}：", item.isalnum())
    print()
    # 验证所有的字符是否的大小写
    sList = ["helloZIyan", "ziyan", "YANRAN你好", "ziyan你好", "MENGMENG"]
    for item in sList:
        print(f"str.islower() 验证小写  {item}：", item.islower())
    print()
    for item in sList:
        print(f"str.isupper() 验证大写  {item}：", item.isupper())
    print()
    # 验证是否只有首字母大写（中间有空格间隙的也算首字母）
    sList = ["Ziyan", "Zi Yan", "HelloZIyan", "ziyan", "Yanran你好", "MENGMENG"]
    for item in sList:
        print(f"str.istitle() 只有首字母大写  {item}：", item.istitle())
    print()
    # 验证是否都是空白字符
    sList = ["\t", "   ", "\n", "    qwe"]
    for item in sList:
        print(f"str.isspace() 验证是否都是空白字符  {item}：", item.isspace())
    print()
# 内置的字符
def inn_str():
    print("-" * 50, "python内置的字符", "-" * 50)
    import string
    print("小写字母：", string.ascii_lowercase)
    print("大写字母：", string.ascii_uppercase)
    print("小写+大写字母：", string.ascii_letters)
    print("数字：", string.digits)
    print("十六进制数字：", string.hexdigits)
    print("八进制数字：", string.octdigits)
# 字符串去重
def str_quchong():
    print("-" * 50, "字符串去重", "-" * 50)
    s = "hwhahjadghqjhzasbhfwejahqahragwe"
    # 方法一：拼接
    news = ""
    for item in s:
        if item not in news:
            news += item
    print("字符串去重:", news)
    # 方法二：通过集合去重
    news = set(s)
    print("通过集合去重:", news)
    mylist = list(news)
    print("没排序前的无序：", mylist)
    mylist.sort(key=s.index)
    s2 = "".join(mylist)
    print("排序后：", s2)
# 练习
def lianxi():
    print("-" * 50, "练习", "-" * 50)
    # 公司名称
    name = "传智播客"
    # 当前股价
    stock_prick = 19.99
    stock_code = "00303"
    # 每日增长系数
    stock_x = 1.2
    # 增长天数
    growth_days = 8
    print(f"公司:{name},股票代码:{stock_code},当前股价:{stock_prick}")
    print("每日增长系数%3.1f,经过%d天增长后,股价达到了:%5.2f" % (stock_x, growth_days, stock_prick * stock_x ** growth_days))

if __name__ == '__main__':
    str_quchong()